Skip to content

使用 Windows Docker Desktop 建立 Oracle 環境

TLDR

  • Oracle 官方已停止在 Docker Hub 提供預先建置的 Image,必須透過 Oracle GitHub 下載 Dockerfile 並手動建置。
  • Windows 環境下需確保具備 Linux Bash Shell 環境(如 Git Bash 或 WSL)。
  • 建置 Image 時,若遇到 FROM oraclelinux 標籤錯誤,需檢查並修正為 Docker Hub 上存在的 Tag(建議使用 7-slim)。
  • 若遇到 MD5 檢查錯誤,可在建置指令中加入 -i 參數忽略檢查。
  • 12c 以上版本採用 CDB/PDB 架構,建立使用者時需切換至 PDB,並使用 SERVICE_NAME 進行連線。
  • 容器重啟後若發現使用者消失,通常是因為 PDB 資料庫掛載延遲,稍候即可恢復。

安裝前的準備

在 Windows Docker Desktop 環境下建立 Oracle 容器,必須滿足以下條件:

  • 僅支援 Linux Container 模式。
  • 必須具備 Linux Bash Shell 環境,可使用 Git Bash 或 Windows 內建的 Bash。

安裝步驟

由於官方不再提供直接下載的 Image,請依照下列流程手動建置:

  1. 下載 Oracle GitHub 的 Dockerfile 相關檔案。
  2. 查看 DockerfileDockerfile.xe 中的 INSTALL_FILE_1 說明,至 Oracle 官網下載對應的安裝檔案(如 db_home.zip)並放置於對應版本資料夾內。
  3. 在 Bash 中進入存放 Dockerfile 的目錄,執行建置指令:
    bash
    ./buildContainerImage.sh -v [version] -t [image_name:tag] [-e | -s | -x] [-i] [-o]
    • -v: 版本號。
    • -t: 設定 Image 的 Tag。
    • -e / -s / -x: 分別對應 Enterprise、Standard Edition 2 或 Express Edition。
    • -i: 忽略 MD5 checksums 檢查(若發生錯誤時使用)。
    • -o: 傳入額外建置參數,例如 '--build-arg SLIMMING=false'

排除 Image 建置錯誤

若建置過程中出現 Image 不存在的錯誤,請開啟 Dockerfile 搜尋 FROM oraclelinux,確認該 Tag 是否存在於 Oracle Docker Hub,若不存在請手動修正為有效 Tag(如 7-slim)。

  1. 建立 docker-compose.yml 進行部署:
    yaml
    version: '3.7'
    
    services:
      TP-Oracle:
        image: oracle/database:{image tag}
        container_name: TP-Oracle
        ports:
          - 1521:1521
          - 5500:5500
          - 8080:8080
        volumes:
          - {local oradata}:/opt/oracle/oradata
          - {local scripts/startup}:/opt/oracle/scripts/startup
          - {local scripts/setup}:/opt/oracle/scripts/setup
        restart: always
        environment:
          - ORACLE_PWD={your password}
          - ORACLE_CHARACTERSET=AL32UTF8

建立使用者與連線設定

在 12c 以上版本,由於架構包含 CDB 與 PDB,若直接建立使用者遇到 ORA-01017 錯誤,請依下列方式處理:

  1. 使用 SYS 帳號以 sysdba 角色登入。
  2. 執行 show pdbs 查詢 PDB 名稱(通常為 ORCLPDB1XEPDB1)。
  3. 執行 ALTER SESSION SET CONTAINER={查詢到的名稱} 切換至 PDB。
  4. 在該 PDB 下重新建立使用者並賦予 connectresourceunlimited tablespace 權限。
  5. 連線時請務必使用 SERVICE_NAME={PDB Name},而非 SID

踩雷紀錄與注意事項

  • 權限問題:在 11g 與 12c XE 版本中,常因資料夾權限問題導致容器無法運行,建議優先使用 19c SE2 版本。
  • 重啟後資料消失:若電腦或 Docker 重啟後發現使用者消失,通常是因為 PDB 資料庫掛載速度較慢,請靜待一段時間即可恢復。

異動歷程

  • 2022-10-24 初版文件建立。